Celem projektu było określenie jakie czynniki najlepiej pozwalają przewidzieć energię wytwarzaną przez panele fotowoltaiczne na podstawie danych pochodzących z trzech sąsiadujących elektrowni słonecznych we Włoszech. Dane pochodzą z czujników umieszczonych przy panelach fotowoltaicznych. Każdy wiersz w zbiorze danych zawiera uśrednione informacje z jednej godziny pomiarów pojedynczej jednostki fotowoltaicznej.
Analiza danych wykazała korelację pomiędzy wytwarzaniem energii a poniższymi czynnikami:
| Typ | Czynniki |
|---|---|
| Metorologiczne | nasłonecznienie, wilgotność, zachmurzenie, siła wiatru, ciśnienie i temperatura |
| Geograficzne | azymut, szerokość i wysokość geograficzna |
Najbardziej pozytywny wpływ na ilość wytwarzanie energii ma nasłonecznienie, natomiast najbardziej negatywny mają wilgotność powietrza oraz zachmurzenie.
library(caret)
library(dplyr)
library(ggplot2)
library(knitr)
library(plotly)
library(reshape2)
set.seed(23)
Sys.setenv(TZ="Europe/Warsaw")
csv_file <- read.csv("elektrownie.csv") %>%
select(order(colnames(.)))
NA).sum(is.na(csv_file))
## [1] 0
Date do zapisu dat (format %m/%d/%Y %H:%M).csv_file <- mutate(csv_file, date = as.Date(data, format="%m/%d/%Y %H:%M"))
kwh równe 0, przy nasłonecznieniu (irradiamento, irri, irri_pvgis_mod) większym od zera zostały zinterpretowane jako błędne dane będące wynikiem awarii czujnika w chwili pomiaru. Takie dane zostały zastąpione średnimi wartościami wyprodukowanej energii w danym tygodniu i godzinie.csv_file <- csv_file %>%
mutate(week = as.numeric(format(date, format="%W"))) %>%
group_by(idsito, anno, week, ora) %>%
mutate(
kwh = ifelse(
kwh == 0 & (irradiamento > 0 | irri > 0 | irri_pvgis_mod > 0),
mean(kwh),
kwh
)
)
kwh większej od zera zinterpretowano jako błędne dane. Każdy taki przypadek zastąpiono średnimi wartościami w danym tygodniu i godzinie.csv_file <- csv_file %>%
group_by(idsito, anno, week, ora) %>%
mutate(
irradiamento = ifelse(
irradiamento == 0 & kwh > 0,
mean(irradiamento),
irradiamento
),
irri = ifelse(
irri == 0 & kwh > 0,
mean(irri),
irri
),
irri_pvgis_mod = ifelse(
irri_pvgis_mod == 0 & kwh > 0,
mean(irri_pvgis_mod),
irri_pvgis_mod
)
)
| Liczba obserwacji | Liczba atrybutów |
|---|---|
| 235790 | 53 |
| Średnia arytmetyczna |
Odchylenie standardowe |
Wartość minimalna |
Wartość maksymalna |
|
|---|---|---|---|---|
| ageinmonths | NA | 0.377969850595731 | 0.000 | 1.000 |
| altitude | NA | 0.180640706510216 | 0.111 | 0.884 |
| altitudei | NA | 0.149421687798409 | 0.000 | 0.982 |
| anno | NA | 0.500001053775684 | 2012 | 2013 |
| azimuth | NA | 0.196541434110587 | 0.128 | 0.818 |
| azimuthi | NA | 0.182281959028745 | 0.000 | 1.000 |
| cloudcover | NA | 0.259547943384582 | 0.00 | 1.00 |
| cloudcoveri | NA | 0.0300723674633868 | 0.000 | 1.000 |
| data | NA | NA | 1/1/2013 10:00 | 9/9/2013 9:00 |
| day | NA | 0.275857170407624 | 0.000 | 1.000 |
| dewpoint | NA | 0.095644093176755 | 0.139 | 0.865 |
| dewpointi | NA | 0.013390730911713 | 0.063 | 0.415 |
| dist | NA | 0.296791492738785 | 0.000000000 | 1.000000000 |
| humidity | NA | 0.181745717417974 | 0.16 | 1.00 |
| humidityi | NA | 0.0420095574994939 | 0.034 | 0.579 |
| icon | NA | 0.307598578619976 | 0.000 | 0.750 |
| id | NA | 77627.6114157251 | 1 | 276488 |
| idbrand | NA | 0.11871715206601 | 0.000 | 0.417 |
| idmodel | NA | 0.172247431713612 | 0.000 | 0.750 |
| idsito | NA | 0.133135226997158 | 0.000 | 0.425 |
| irr_pvgis_mod | NA | 0.221045459338012 | 0.000 | 1.000 |
| irradiamento | NA | 0.134180830800575 | 0.0000000000 | 0.7100000000 |
| irri | NA | 0.0115436397438759 | 0.108 | 1.000 |
| irri_pvgis_mod | NA | 0.0534824716006301 | 0.00100000 | -0.02500000 |
| kwh | NA | 0.210576920016183 | 0.0000000000 | 1.0000000000 |
| lat | NA | 0.0379863282904341 | 0.415 | 0.553 |
| lon | NA | 0.15243695708491 | 0.154 | 0.691 |
| ora | NA | 0.304227015135245 | 0.000 | 1.000 |
| pcnm1 | NA | 0.204379821435305 | 0.000 | 1.000 |
| pcnm10 | NA | 0.212375241468405 | 0.000 | 1.000 |
| pcnm11 | NA | 0.206642766632876 | 0.000 | 1.000 |
| pcnm12 | NA | 0.228931898102406 | 0.000 | 1.000 |
| pcnm13 | NA | 0.19951261364516 | 0.137 | 1.000 |
| pcnm14 | NA | 0.183831119090762 | 0.000 | 1.000 |
| pcnm15 | NA | 0.204619008927417 | 0.000 | 1.000 |
| pcnm2 | NA | 0.214273652558885 | 0.000 | 0.972 |
| pcnm3 | NA | 0.217046163667059 | 0.000 | 1.000 |
| pcnm4 | NA | 0.255570141211408 | 0.000 | 1.000 |
| pcnm5 | NA | 0.250232450734015 | 0.000 | 1.000 |
| pcnm6 | NA | 0.239255594107885 | 0.000 | 1.000 |
| pcnm7 | NA | 0.224933208175947 | 0.000 | 1.000 |
| pcnm8 | NA | 0.263608320452407 | 0.000 | 1.000 |
| pcnm9 | NA | 0.261624641269982 | 0.000 | 1.000 |
| pressure | NA | 0.258467636284461 | 0.000 | 0.769 |
| pressurei | NA | 0.0039992935298197 | 0.000 | 1.000 |
| temperatura_ambiente | NA | 0.172218245052092 | 0.045 | 0.818 |
| tempi | NA | 0.0631091005324502 | 0.009 | 0.983 |
| windbearing | NA | 0.230388817028362 | 0.000 | 0.769 |
| windbearingi | NA | 0.0340350360098665 | 0.000 | 1.000 |
| windspeed | NA | 0.0501476671640903 | 0.000 | 0.696 |
| windspeedi | NA | 0.00488113428267297 | 0.000 | 1.000 |
| date | NA | NA | 2012-01-02 | 2013-12-31 |
| week | NA | 15.0594529266089 | 0 | 53 |
Atrybuty zbioru można podzielić na kilka grup przedstawionych poniżej. Każda sekcja zawiera opis każdego atrybutu oraz wykres rozkładu dla atrybutów liczbowych.
Atrybuty opisowe czujników. Wartości tych atrybutów zostały znormalizowane do zakresu <0, 1>.
| Nazwa atrybutu | Opis |
|---|---|
ageinmonths |
Wiek czujnika w miesiącach |
idbrand |
Identyfikator marki czujnika |
idmodel |
Identyfikator modelu czujnika |
Dane o miejscu wykonania pomiaru. Wartości tych atrybutów zostały znormalizowane do zakresu <0, 1>.
| Nazwa atrybutu | Opis |
|---|---|
altitude |
Wysokość nad poziomem morza |
azimuth |
Azymut |
lat |
Szerokość geograficzna |
lon |
Długość geograficzna |
Dane meterologiczne w chwili wykonania pomiaru.
| Nazwa atrybutu | Opis |
|---|---|
cloudcover |
Zachmurzenie |
dewpoint |
Temperatura punktu rosy |
humidity |
Wilgotność powietrza |
irradiamento |
Nasłonecznienie |
pressure |
Ciśnienie |
temperatura_ambiente |
Temperatura powietrza |
windbearing |
Kierunek wiatru |
windspeed |
Prędkość wiatru |
Dane identyfikujące pomiar, zawierające wartość wyprodukowanej energii (kwh).
| Nazwa atrybutu | Opis |
|---|---|
anno |
Rok pomiaru |
data |
Data pomiaru |
day |
Dzień pomiaru |
id |
Identyfikator pomiaru |
idsito |
Identyfikator miejsca pomiaru |
kwh |
Kilowatogodziny wyprodukowanej energii |
ora |
Godzina pomiaru |
Dane nienależące do żadnej z powyższych grup oraz trudne do interpretacji.
| Nazwa atrybutu | Opis |
|---|---|
dist |
Dzień pomiaru |
icon |
Identyfikator ikony (prawdopodobnie obrazka wizualizującego aktualne warunki pogodowe) |
irri |
Prawdopodobnie alternatywna wartość nasłonecznienia |
irr_pvgis_mod |
Prawdopodobnie wartość opisująca nasłonecznienie |
irri_pvgis_mod |
Prawdopodobnie wartość opisująca nasłonecznienie |
pcnm1 ... pcnm15 |
Principal Coordinates Of Neighbourhood Matrix |
tempi |
Wartość reprezentująca temperaturę |
Wybrano metodę regresji liniowej.
data_to_train <- csv_file %>%
ungroup() %>%
select(
altitude, azimuthi, cloudcover, dist, humidity, idsito, irradiamento, irri,
kwh, pressure, temperatura_ambiente, tempi, windspeed
)
inTraining <- createDataPartition(
y = data_to_train$idsito,
p = .75,
list = FALSE
)
training <- data_to_train[inTraining,]
testing <- data_to_train[-inTraining,]
ctrl <- trainControl(
method = "repeatedcv",
number = 2,
repeats = 5
)
fit <- train(
kwh ~ .,
data = training,
method = "lm",
metric = "RMSE",
trControl = ctrl
)
classes <- predict(fit, newdata = testing)
postResample(classes, testing$kwh)
## RMSE Rsquared MAE
## 0.10256471 0.76225778 0.06451111
fit %>% summary()
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.63166 -0.04188 -0.00801 0.03173 1.06872
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.207793 0.005902 35.209 < 2e-16 ***
## altitude 0.034443 0.002459 14.005 < 2e-16 ***
## azimuthi -0.094763 0.001743 -54.379 < 2e-16 ***
## cloudcover -0.032720 0.001038 -31.516 < 2e-16 ***
## dist 0.052877 0.001047 50.502 < 2e-16 ***
## humidity -0.149497 0.002073 -72.126 < 2e-16 ***
## idsito 0.086042 0.002042 42.136 < 2e-16 ***
## irradiamento 1.232540 0.002981 413.453 < 2e-16 ***
## irri -0.224955 0.026196 -8.588 < 2e-16 ***
## pressure -0.013996 0.001083 -12.925 < 2e-16 ***
## temperatura_ambiente -0.045785 0.002441 -18.754 < 2e-16 ***
## tempi -0.060819 0.004946 -12.297 < 2e-16 ***
## windspeed -0.040842 0.005096 -8.014 1.11e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1022 on 176830 degrees of freedom
## Multiple R-squared: 0.7646, Adjusted R-squared: 0.7646
## F-statistic: 4.787e+04 on 12 and 176830 DF, p-value: < 2.2e-16
Wyniki nie są zaskakujące. Atrybutami, które mają największy wpływ na ilość wytwarzanej energii przez panele fotowoltaiczne są nasłonecznienie (korelacja dodatnia) oraz wilgotność (korelacja ujemna).
Prócz nasłonecznienia, na ilość wytwarzanej energii pozytywnie wpływają również wysokość nad poziomem morza oraz data wykonania pomiaru. Natomiast negatywny wpływ, prócz wilgotności, ma również wysoki wskaźnik atrybutów takich jak zachmurzenie, cieśnienie atmosferyczne, azymut czy prędkość wiatru.
To właśnie te atrybuty pozwalają najlepiej przewidzieć energię wytwarzaną przez pojedynczy panel w danej godzinie.